恶意代码分析之 RC4 算法学习
本文为看雪论坛精华文章
看雪论坛作者ID:jishuzhain
RC4(Rivest Cipher 4)是一种基于密钥流的加密算法,它的密钥长度可变,密钥长度在 1-256 字节范围。它的特点是算法简单、运算效率高,而且非线性度良好。
它加解密使用相同的密钥,假设定义 RC4 的运算过程是RC4(key,data),那么,密文=RC4(key,明文),明文=RC4(key,密文)。因此也属于对称加密算法,WEP 里也用到了 RC4 算法。
近期分析多个勒索软件时,会遇到使用 RC4 解密相应字符串或者配置的过程,加之之前阅读过相关的分析报告后也发现存在勒索软件使用 RC4 解密相应的内容的行为。
由于笔者之前并未学习过密码学,于是对 RC4 算法进行学习,并相应记录笔记。
RC4 由伪随机数生成器和异或运算组成,RC4 一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个 S 盒。S 盒用来加密数据,而且在加密过程中 S 盒会变化。
>>>> 3.1 伪代码
3.1 伪代码
出现的几个变量如下:S、K、T、k
S S 盒,是一个 256 个字节大小的 char 类型数组,char S[256]
K 密钥 K,长度限定在 1-256 个字节
T 临时变量 T,大小也是 256 个字节的数组
k 输出的密钥流,大小与实际需要加密的内容一致。
S 盒与临时变量 T 初始化,伪代码如下:
for i=0 to 255 do
S[i]=i;
T[i]=K[ I % K_len ];
for i=0 to 255 do
j= ( j+S[i]+T[i]) % 256;
swap(S[i],S[j]); //交换
for r=0 to r_len do //r为明文
i=(i+1) % 256;
j=(j+S[i]) % 256;
swap(S[i],S[j]);
t=(S[i]+S[j]) % 256;
k[r]=S[t];
d[r] ^= k[r]
>>>> 4.1 主文件
4.1 主文件
#include<Windows.h>
#include "RC4.h"
int main()
{
unsigned char text[] = "UOIzVDP2Vzs=";
unsigned char key[] = "flag{this_is_not_the_flag_hahaha}";
unsigned int i;
printf("加密前的数据:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%c", text[i]);
printf("\n");
rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));
printf("加密后的数据:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%X", text[i]);
printf("\n");
rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));
printf("解密后的数据:");
for (i = 0; i < strlen((const char*)text); i++)
printf("%c", text[i]);
printf("\n");
system("pause");
return 0;
}
>>>> 4.2 RC4.c
4.2 RC4.c
static void rc4_init(unsigned char* s_box, unsigned char* key, unsigned int key_len)
{
unsigned char Temp[256];
int i;
for (i = 0; i < 256; i++)
{
s_box[i] = i;//顺序填充S盒
Temp[i] = key[i%key_len];//生成临时变量T
}
int j = 0;
for (i = 0; i < 256; i++)//打乱S盒
{
j = (j + s_box[i] + Temp[i]) % 256;
unsigned char tmp = s_box[i];
s_box[i] = s_box[j];
s_box[j] = tmp;
}
}
void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len)
{
unsigned char s_box[256];
rc4_init(s_box, key, key_len);
unsigned int i = 0, j = 0, t = 0;
unsigned int Temp;
for (Temp = 0; Temp < data_len; Temp++)
{
i = (i + 1) % 256;
j = (j + s_box[i]) % 256;
unsigned char tmp = s_box[i];
s_box[i] = s_box[j];
s_box[j] = tmp;
t = (s_box[i] + s_box[j]) % 256;
data[Temp] ^= s_box[t];
}
}
>>>> RC4.h
RC4.h
#define RC4_H
/*
导出rc4_crypt函数,参数为要加密的数据、数据长度、密码、密码长度
*/
void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len);
#endif
>>>> 5.1 静态分析
5.1 静态分析
>>>> 5.2 动态分析
5.2 动态分析
看雪ID:jishuzhain
https://bbs.pediy.com/user-678001.htm
推荐文章++++
好书推荐